#pragma once
#ifndef CONVERT_H
#define CONVERT_H

#include <cmath>
#include <iostream>
#include <string>

/* 
    16 to 8
    ten_convert(convert_ten("B3620", 16), 8);
*/

// 任意进制转化为十进制
int convert_ten(std::string str, int p)
{
    int ret = 0;
    int weight = 0;
    for (int i = str.size() - 1; i >= 0; i--)
    {
        int tmp;
        if (str[i] >= 'A' && str[i] <= 'F') 
            tmp = str[i] - 'A' + 10;
        else   
            tmp = str[i] - '0';
        ret += tmp * pow(p, weight);
        weight++;
    }
    return ret;
}

// 十进制转化为任意进制
std::string ten_convert(int n, int p)
{
    std::string ret;
    while (n)
    {
        int tmp = n % p;
        if (tmp >= 10) ret += tmp - 10 + 'A';
        else ret += tmp + '0';
        n /= p;
    }
    std::reverse(ret.begin(), ret.end());
    return ret;
}

// 【负数进制的转换】
// 思想：等式变换
// 被除数 = 除数 * 商 + 余数
// 可以变换为：被除数 - 除数 * 商 = 余数
// 最终式子：被除数 - 除数 * 商 - 除数 = 余数 - 除数 => 被除数 - 除数 * (商 + 1) = 余数 - 除数
// 最终代码相当于在短除法的上面做操作，等式成立保证了负数进制相乘结果相同
void down_zero_convert(int n, int r)
{
    if (n == 0) return;
    int m = n % r;

    if (m < 0) m -= r, n += r;

    if (m >= 10) m = m - 10 + 'A';
    else m += '0';

    down_zero_convert(n / r, r); // 递归保证反向输出
    std::cout << char(m);
    return;
}




#endif